PackageManagerService概述

PackageManagerService主要负责对系统的apk进行管理,不管是系统apk(/system/app),还是我们手工安装上去的,系统所有的apk都是由其管理的。

我们看一下PackageManager类图


从图可知,PackageManage负责提供对外的接口,PackageManage是一个抽象类,具体的实现是ApplicationPackageManager,ApplicationPackageManager有一个IPackageManager类型的变量mPM,负责和PackageManagerService进行Binder交互,IPackageManager在frameworks/base/core/java/android/content/pm/IPackageManager.aidl。

再来看下PackageManagerService的类图:



从它的类图我们可以看出,PackagemanagerService主要管理apk,其实就是管理其中的组件等,如Activiey、Service,从apk中解析其中的组件,保存到相关结构中,以使得后面可以通过相关的接口可以查询系统安装组件,apk的安装,卸载,删除都是由PackageManagerService负责的,从图中我们也可以看到相关类的作用

下面是PackageManagerService中一些比较重要的成员变量:

// Keys are String (package name), values are Package.  This also serves
    // as the lock for the global state.  Methods that must be called with
    // this lock held have the prefix "LP".
    final HashMap<String, PackageParser.Package> mPackages =  //以包名为key保存系统中所以安装的Package
            new HashMap<String, PackageParser.Package>();

    final Settings mSettings;//用来保存一些系统的设置,
    boolean mRestoredSettings;

    // Group-ids that are given to all packages as read from etc/permissions/*.xml.
    int[] mGlobalGids; //全局组id,通过从etc/permissions/*.xml读取,可以用来把某个组赋予某个packages

    // These are the built-in uid -> permission mappings that were read from the
    // etc/permissions.xml file.
    final SparseArray<HashSet<String>> mSystemPermissions =
            new SparseArray<HashSet<String>>();

    // These are the built-in shared libraries that were read from the
    // etc/permissions.xml file.
    final HashMap<String, String> mSharedLibraries = new HashMap<String, String>();//共享库

    // Temporary for building the final shared libraries for an .apk.
    String[] mTmpSharedLibraries = null;

    // These are the features this devices supports that were read from the
    // etc/permissions.xml file.
    final HashMap<String, FeatureInfo> mAvailableFeatures =//系统可用特性
            new HashMap<String, FeatureInfo>();

    // All available activities, for your resolving pleasure.
    final ActivityIntentResolver mActivities =//系统所有的Activity
            new ActivityIntentResolver();

    // All available receivers, for your resolving pleasure.
    final ActivityIntentResolver mReceivers =//系统所有的Receivers
            new ActivityIntentResolver();

    // All available services, for your resolving pleasure.
    final ServiceIntentResolver mServices = new ServiceIntentResolver();//系统所有的Services

    // Keys are String (provider class name), values are Provider.
    final HashMap<ComponentName, PackageParser.Provider> mProvidersByComponent =//以ComponentName为key,系统所有的Provider
            new HashMap<ComponentName, PackageParser.Provider>();

    // Mapping from provider base names (first directory in content URI codePath)
    // to the provider information.
final HashMap<String, PackageParser.Provider> mProviders =//以Name为key,系统所有的Provider

PackageManagerService用到了几个重要的支撑类:

1、  PackageParser:


 这个类主要用于解析apk,分析其AndroidManifest.xml得到package的各种信息. 特别的PackageParser.Package这个类用于容纳解析出的信息. 描述的是Package的静态的一些属性,其中ActivityInfo、ServiceInfo实现Parcelable接口,用于Binder进程间传递,Activity、Service用于解析时保存相关属性值,具体的值都是保存在内部变量ActivityInfo、ServiceInfo中

 

2、PackageManagerService.Settings:


用于容纳当前有效的package信息, 它是动态的. 例如, user id, shareUser, permission, signature以及origPackage(也就是mRenamedPackages)相关信息. 所谓的installpackage就包括从要安装的package中抽取信息更新PackageManagerService.Settings中的内容. 特别的, Settings针对shareUser和origPackage做了特别的关照. 另外, 为了加速启动速度,Settings的内容会写入到/data/system/packages.xml, packages-backup.xml, 和packages.list中, 下次启动时会直接载入.,不用重新去生成PackageSetting结构

Installer, 这个类协助安装过程, 更多的是将针对文件/路径的操作放到了c/cpp实现. 真正的工作是是由installd承担的,Installer只是通过named socket "installd"连接installd, 使用简单的cmd-respond协议指挥installd完成工作. 在其'install'命令中可以看到, 其实只是创建了/data/data/<pkgName>目录而已.

3、  另外一些是跟权限有关的:


PackageSetting、SharedUserSetting,PackageSetting这个类主要是描述当前系统存在的Package的一些状态信息,如代码目录、安装时间、更新时间等一些动态的属性。SharedUserSetting则用来描述可被其他进程共享的一些用户。

与PackageManager相关的代码主要在:

frameworks\base\services\java\com\android\server\pm

frameworks\base\core\java\android\content\pm


  • 0
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值